<?php
class Exts_Db_Table_Rowset_Abstract extends Zend_Db_Table_Rowset_Abstract{
	

	/**
	 * La idea de este mensaje es procesar un lote de datos uno a uno y procesar cada dato y acumular resultados
	 * El primer parametro es el valor basico del resultado y el segundo es un closure capaz de trabajar con una fila. 
	 * 
	 * un ejemplo sería 
	 * $rows->inyectInto(0, new Exts_Closures_Closure("$row, $result", " $result += $row->cantidad"));
	 * esto asigna como primer valor al resultado el 0, luego suma un valor cantidad. Basicamente es una sumatoria.  
	 */
	
	public function inyectInto ($baseValue, Exts_Closures_InyectClosure $closure) {
		$result = $baseValue;
		foreach( $this as $row ) {	
			$result = $closure->invoke($row, $result);
		}
		return $result;
	}
	/*
	 * Devuelve un nuevo rowset con las filas que pasen la regla impuesta por el closure
	 * */	
	public function select(Exts_Closures_BooleanClosure $closure){
		$rows = array();
		foreach ( $this as $row ){
			if ($closure->invoke($row)) {
				$rows[] = $row; 
			}
		}
		return $this->_makeInstance($rows);
	}
	
	/*
	 * Devuelve un array de lo que sea que devuelva el closure aplicado a cada fila.  
	 * */
	public function collect(Exts_Closures_Closure $closure) {
		$collected = array();
		foreach( $this as $row ){
			$collected[] = $closure->invoke($row);
		}
		return $collected;
	}
	/*
	 * Selecciona y colecta datos
	 * */
	public function selectThenCollect(Exts_Closures_BooleanClosure $selectClosure, Exts_Closures_Closure $collectClosure) {
		$collected = array();
		foreach( $this as $row ){
			if ($selectClosure->invoke($row)) {
				$collected[] = $collectClosure->invoke($row);
			} 
		}
		return $collected;
	}
	
	/*
	 * agrega una fila a un set. 
	 * */
	protected function _addRow ($row) {
		$this->_rows[] = $row->toArray();
		$this->_readOnly = true;
	}
	/*
	 * Crea un nuevo set. 
	 * */
	protected function _makeInstance ($rows){
		return $this->getTable()->_makeNewRowset($rows);
	}
}
